home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / lib / mntlib44.zoo / mntlib / fseek.c < prev    next >
C/C++ Source or Header  |  1994-03-01  |  1KB  |  58 lines

  1. /* something like the origonal
  2.  * from Dale Schumacher's dLibs
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <unistd.h>
  7.  
  8. int
  9. fseek(fp, offset, origin)
  10.   FILE *fp;
  11.   long offset;
  12.   int origin;
  13. {
  14.     long pos, count;
  15.     unsigned int f;
  16.     int rv;
  17.     
  18.     /* Clear end of file flag */
  19.     f = (fp->_flag &= ~_IOEOF);
  20.     count = fp->_cnt;
  21.     
  22.     if((!(f & _IOBIN))         ||
  23.        (f & (_IOWRT))        ||
  24.        (count == 0)         ||
  25.        (f & _IONBF)        || 
  26.        (origin == SEEK_END) )
  27.     {
  28.     rv = fflush(fp);
  29.     return ((rv == EOF) || (lseek(fp->_file, offset, origin) < 0)) ?
  30.         -1 : 0;
  31.     }
  32.     
  33.     /* figure out if where we are going is still within the buffer */
  34.     pos = offset;
  35.     if(origin == SEEK_SET)
  36.     {
  37.     register long realpos;
  38.     if((realpos = tell(fp->_file)) < 0)
  39.     {    /* no point carrying on */
  40.         return -1;
  41.     }
  42.     pos += count - realpos;
  43.     }
  44.     else offset -= count;    /* we were already count ahead */
  45.     
  46.     if( (!(f & _IORW)) && (pos <= count) && (pos >= (fp->_base - fp->_ptr)) )
  47.     {
  48.     fp->_ptr += pos;
  49.     fp->_cnt -= pos;
  50.     return 0;
  51.     }
  52.     /* otherwise */
  53.     fp->_ptr = fp->_base;
  54.     fp->_cnt = 0;
  55.     if(f & _IORW) fp->_flag &= ~_IOREAD;
  56.     return (lseek(fp->_file, offset, origin) < 0) ? -1 : 0;
  57. }
  58.